let currentToken = null
const EOF = Symbol("EOF") // EOF: End of File 利用Symbol唯一性特点

function data(c) { // 状态机 用作状态迁移
  if (c == '<') { // 标签左尖括号为开始
    return tagOpen
  } else if (c == EOF) { // 结束
    return
  } else { // 其他字符当文本节点
    return data
  }
}

function tagOpen(c) { // 判断标签种类 开始标签、结束标签、自封闭标签
  if (c == '/') { // 判断是否是结束标签
    return endTagOpen
  } else if (c.match(/^[a-zA-Z]$/)) { // 开始标签 或自封闭标签
    return tagName(c)
  } else {
    return
  }
}

function endTagOpen(e) {
  if (c.match(/^[a-zA-Z]$/)) {
    return tagName(c)
  } else if (c == '>') {

  } else if (c == EOF) {

  } else {

  }
}

// <html prop
function tagName(c) {
  if (c.match(/^[\t\n\f ]$/)) { // 空白符结束，在html里有效的有：tab符、换行符、禁止符、空格
    return beforeAttributeName
  } else if (c == '/') { // 遇到 自封闭标签
    return selfClosingStartTag
  } else if (c.match(/^[a-zA-Z]$/)) {
    return tagName(c)
  } else if (c =='>') { // 结束 返回到data 开始下一个标签
    return data
  } else {
    return tagName
  }
}

// 暂时不进行属性处理 一般会期待一个属性名或正斜杠
function beforeAttributeName(c) {
  if (c.match(/^[\t\n\f ]$/)) {
    return beforeAttributeName
  } else if (c =='>') {
    return data
  } else if (c == '=') {
    return beforeAttributeName
  } else {
    return beforeAttributeName
  }
}

// 分析到一个标签 <div / 只有一个 /了，
function selfClosingStartTag(c) {
  if (c =='>') {
    return data
  } else if (c =='EOF') {

  } else {

  }
}


module.exports.parseHTML = function parseHTML(html) {
  let state = data // 初始状态一般命名为data
  for(let c of html) { // 对每个字符循环，并使用状态机进行判断处理
    state = state(c)
  }
  // 状态机 强迫一些节点结束 额外给一个无效的字符
  // (因为html最后会有文件终结，有的文本节点可能没有结束的状态)
  state = state(EOF)
}

// 第一步：HTML解析 | HTML Parse模块的文件拆分
// 为了方便文件管理，把parser单独拆到文件中
// parser接受HTML文本作为参数，并返回一个DOM树


// 第二步：用FSM 来实现HTML的分析
// 在HTML 标准中，已经规定了HTML的状态
// https://html.spec.whatwg.org/multipage/ 的 Tokenization 章节 是html解析的词法 状态机 
// Toy-Browser 只挑选其中一部分状态，实现一个简单版本


// 第三步：解析标签
// 主要的标签：开始标签、结束标签、自封闭标签
// 这一步暂时忽略属性

